自学三天爬虫 抓取了所有年龄小于96年的女优

0基础学两天多东拼西凑弄出来的,看着代码能跑起来很欣慰。本来抓数据之前的想法也没了,顿时索然无味。

知道没啥技术含量,也不知道代码规范不,还希望有大佬能指点一下哪里还能优化。有个问题就是输出csv里面都是带引号和括号的,这个不知道怎么解决。

数据来源的网站是我一直用的,不过很多人的信息应该不全,但是网站速度快,我也就将就用了。
链接:下载:https://lanzous.com/ic2c2pi 密码:7geq


代码:

  1. from fake_useragent import UserAgent
  2. import requests
  3. import csv
  4. import random
  5. import time
  6. import socket
  7. import http.client
  8. import re
  9. def get_one_page(url):
  10.         fake_ua = UserAgent()  # 构建UserAgent()对象
  11.         headers = {'User-Agent': fake_ua.random}  # 用random来随机取得用户dai--li。
  12.         while True:
  13.                 try:
  14.                         response = requests.get(url, headers=headers)
  15.                         response.encoding = 'utf-8'
  16.                         break
  17.                 except socket.timeout as e:
  18.                         print('3:', e)
  19.                         time.sleep(random.choice(range(8, 15)))
  20.                 except socket.error as e:
  21.                         print('4:', e)
  22.                         time.sleep(random.choice(range(20, 60)))
  23.                 except http.client.BadStatusLine as e:
  24.                         print('5:', e)
  25.                         time.sleep(random.choice(range(30, 80)))
  26.                 except http.client.IncompleteRead as e:
  27.                         print('6:', e)
  28.                         time.sleep(random.choice(range(5, 15)))
  29.         return response.text
  30. def parse_one_page(html):
  31.         patten = re.compile('<a.*?"avatar-box text-center".*?href="(.*?)"', re.S)
  32.         items = re.findall(patten, html)  # 页面一里所有女优链接
  33.         for temp in items:
  34.                 items2 = get_one_page(temp)
  35.                 print()
  36.                 pattern = re.compile(r'<spansclass=.*?pb10.*?">(.*?)</span>')
  37.                 name = re.findall(pattern, items2)  # 页面二里面的名字
  38.                 pattern2 = re.compile(r'<spansclass=.*?pb10.*?">.*?</span>.*?([0-9][0-9][0-9][0-9])')
  39.                 age = re.findall(pattern2, items2)  # 页面二里面的出生年龄
  40.                 print(name, age)
  41.                 if not age:  # age == [] 简化
  42.                         print(name, "未提供年龄")
  43.                 else:
  44.                         age2 = float("".join(age))  # 年龄转换为浮点型
  45.                         if age2 > 1996:
  46.                                 age3.append(age)
  47.                                 name3.append(name)
  48.                                 print(temp, name, "入选")
  49.         rows = [dict([('name3', i), ('age3', j)]) for i, j in zip(name3, age3)]
  50.         return rows
  51. def saveCSV(result):
  52.         # 字典数据类型存储
  53.         with open('avBirthdays.csv', 'a+', newline='', encoding='utf-8-sig') as f:
  54.                 f_csv = csv.DictWriter(f, ['name3', 'age3'])
  55.                 for j in result:
  56.                         f_csv.writerow(j)
  57. if __name__ == '__main__':
  58.         for t in range(1, 829):
  59.                 URL0 = "https://www.javbus.com/actresses/%s"
  60.                 url = URL0 % t
  61.                 html = get_one_page(url)  # 获取第一个网页源代码
  62.                 print(url, 1)
  63.                 age3 = []
  64.                 name3 = []
  65.                 result = parse_one_page(html)  # 获取第二个网页数据
  66.                 saveCSV(result)

复制代码

赞 (4)