python_crawl_tips

Python 爬虫整理

IP池推荐

免费(需要翻墙,免费的不稳)

http://www.gatherproxy.com/zh/

http://www.xicidaili.com/nn/

收费(6块钱,1000个)
http://www.mogumiao.com/buy

解决中文乱码问题

data = requests.get(test_url)
html = data.content
html_doc = str(html, 'utf-8')

xpath 或关系处理

具体问题:图片地址被包含在 data-original 或 src 属性中

xpath1 | xpath2

图片保存到本地

wb 二进制方式写入

r = requests.get(img_path, stream=True)
time.sleep(1)
    if r.status_code == 200:
        with open(base_path.format(name), 'wb') as f:
            for chunk in r.iter_content(1024):
                f.write(chunk)

数据排重方法

ids = list(set(ids))

使用正则抓取a标签里有userid类

# 示例
<a class="nickname" target="_blank" href="/u/82df3ebfe1d0">顾梦辰</a>

# solution

username_list = re.findall('<a class="nickname" target="_blank" 
href=(.*?)</a>)', source)

for username in username_list:
    username = username.split('>')[1]
     print(username)

multiprocessing.Pool 传递多个参数

def low_work(t, s):
    print("%d %d" % (t, s))
    time.sleep(t)

if __name__ == '__main__':
    pool = Pool(4)
    tasks = [(x, y) for x in range(4,8) for y in range(10, 14)]
    pool.starmap(low_work, tasks)
    pool.close()

json库使用

返回值具有两种类型 dict 和 list

爬取动态页面生成数据类型网站

对于动态调接口生成data然后通过 jquery 生成 html 的只能通过找相应的数据接口来实现爬虫

因为requests请求下来的没有html(根本原因是没有调生成html的js)

pytharm import 找不到包

首先检查是否安装了,检验方式是在命令行中写 demo 执行 import 指定包查看是否成功

其次 pycharm 中检查 project interpreter 设置路径是否有问题

scrapy框架使用

命令行创建项目 scrapy startproject projectname

然后通过pycharm open文件夹打开进行具体内容编写

headers

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) 
AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/63.0.3239.132 Safari/537.36'}

解决 /u 开头的乱码

str_data = str(response.text)
str_data.encode('utf-8').decode('unicode_escape')

xpath获取不在标签内的数据

files.xpath('//i[@class="iconfont ic-list-read"]/following::text()[1]')

BeautifulSoup格式化html

soup = BeautifulSoup(text, 'html.parser')
print(soup.prettify())

bs findall 方法的注意事项

它使用的逻辑是 A in B

# 需求爬取el数据
# 错误示例
# el_list = el_list_outer[0].find_all(name='div', attrs={"class": "el"})
# <div class="el mk" 也会被删选出来
# 正确方法 使用lambda
# el_list = el_list_outer[0].find_all(lambda tag: tag.get('class') == ['el'])

xpath获取标签下所有文字

introduction = introduction_div[0].xpath('string(.)'

多进程爬取结果存到一个list

from multiprocessing import Pool, Manager
# 在文件开头通过Manager获取result_list
result_list = Manager().list()

if __name__ == '__main__':
    # 使用多进程
    # 进程共享数据
    build_all_url()
    pool = Pool(4)
    # 在get_info函数中执行result_list.addpend(data) 操作
    pool.map(get_info, url_list)
    pool.close()
    pool.join()

xpath 遍历标签

node_list = introduction_div[0].xpath('node()')

bs 遍历标签

for child in el_list_outer.children:
   if type(child) == bs4.element.Tag:
       if child.name != 'div':
           introduction = introduction + child.get_text()

bs select 获取某一标签下指定次序的标签

概述:获取其上一级标签做切片

具体问题:

<a href="/films/9025" title="喜剧之王" class="image-link" data-act="boarditem-click" data-val="{movieId:9025}">
      <img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt=""         class="poster-default" />
      <img data-src="http://p0.meituan.net/movie/59/2366463.jpg@160w_220h_1e_1c"     alt="喜剧之王" class="board-img" />
</a>

解决方案:

a_href = soup.select('#app > div > div > div > dl > dd > a >img')
lianjies = []
for a in a_href:
    lianjies.append(a.select('img')[-1])