import requests,time,re,json,pymongofrom urllib.parse import urlencodefrom requests.exceptions import RequestExceptionfrom bs4 import BeautifulSoup as bs #连接mongodbclient = pymongo.MongoClient(host=‘localhost‘,port=27017)#指定数据库名称db = client.toutiao #应对反扒机制, 不加useragent 爬取不到内容headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" } def get_page_index(offset,keyword): #传递参数 需要传递一个字典格式 #通过分析发现异步加载需要改变 offset这个参数 data = { "offset": offset, "format": "json", "keyword": keyword, "autoload": "true", "count": 20, "cur_tab": 1, "from": "search_tab", } #urlencode 可以将字典类型转换为请求参数 url = "https://www.toutiao.com/search_content/?" + urlencode(data) #url = "https://www.toutiao.com/search_content/?offset=0&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=1&from=search_tab" try: rsp = requests.get(url,headers=headers) if rsp.status_code == 200: #如果等于200 访问成功 #print(rsp.text) return rsp.text else: #print(1) return None except RequestException: ###需要了解的内容 print("请求出现错误") return None #运行main()后 发现返回数据都是json数据 设置解析函数def parse_page_index(html): data =json.loads(html) if data and "data" in data.keys(): #如果确实取回json数据 #用生成器的方法 for item in data.get("data"): yield item.get("article_url")# and item.get("title") #yield item.get("title") #进入每个标题页面 进行解析def get_page_detail(url): try: rsp = requests.get(url,headers=headers) if rsp.status_code == 200: #如果等于200 访问成功 #print(rsp.text) return rsp.text else: #print(1) return None except RequestException: ###需要了解的内容 print("请求出现错误",url) return None def parse_page_detail(html,url): #提取出标题 title = re.compile(r"title: ‘(.*?)‘,",re.S).findall(str(html)) title = "".join(title) #提取标题下每个图片的地址 image_url_list = re.compile(r‘http://p(.*?)"‘,re.S).findall(str(html)) IMG_LIST = [] for i in image_url_list: image_url = "http://p"+ i IMG_LIST.append(image_url) return { "title":title, "url":url, "image_list":IMG_LIST } #建立一个存储方法 来方便mongodb的存储def save_to_mongo(focus_info): if db["toutiao"].insert(focus_info): print("存储成功") return True return False def main(): html = get_page_index(0,"街拍") #因为设置成函数,传递两个可变的变量,方便日后改变 #print(html) #遍历提取生成器产生的每个标题链接 for url in parse_page_index(html): #print(url) time.sleep(1) #将得到的标题url传入解析函数 html = get_page_detail(url) #print(html) #将标题内的页面传入解析 得到标题 和照片地址的一个合集 focus_info = parse_page_detail(html,url) #print(focus_info) save_to_mongo(focus_info) main() 今日得空,发个代码记录一下,感觉自己在代码格式上有些许进步,比以前的代码更公正,可靠性也更强
原文地址:https://www.cnblogs.com/cwkcwk/p/9710752.html
时间: 2024-10-16 21:18:42